#[钛妹]: 钛哥！今天学多态，概念好抽象啊...
#[钛妹]: 比如开车、开船、开飞机都是"驾驶"动作
#[钛妹]: 但具体操作完全不同，这算多态吗？

#[钛哥]: 聪明！这就是多态的典型场景！
#[钛哥]: 看这个简单例子，Python内置函数都是多态大师

#[钛妹]: 快看这个len()函数！
x = "Hello World!"
print(len(x))  # 输出12

mytuple = ("apple", "banana")
print(len(mytuple))  # 输出2

thisdict = {"brand": "Ford", "year": 1964}
print(len(thisdict))  # 输出2

#[钛哥]: 注意！len()会根据参数类型自动适配
#[钛哥]: 字符串返回字符数，元组返回元素数
#[钛哥]: 字典返回键值对数，这就是函数多态！

#[钛妹]: 哇！一个len()走天下，这才是真·通用函数！
#[钛妹]: 那自定义类怎么实现多态呢？
class Car:
    def __init__(self, brand):
        self.brand = brand
        
    def move(self):
        print(f"{self.brand}汽车正在飙车！")

class Boat:
    def __init__(self, brand):
        self.brand = brand
        
    def move(self):
        print(f"{self.brand}游艇正在破浪！")

class Plane:
    def __init__(self, brand):
        self.brand = brand
        
    def move(self):
        print(f"{self.brand}飞机正在爬升！")

#[钛哥]: 关键点：不同类有同名方法
#[钛哥]: 创建实例后统一调用move()
tesla = Car("特斯拉")
yacht = Boat("圣汐")
airbus = Plane("空客")

for obj in (tesla, yacht, airbus):
    obj.move()

#[钛妹]: 原来如此！不管对象类型，只管调用move()
#[钛妹]: 如果加上继承呢？会更方便吗？
class Vehicle:
    def __init__(self, name):
        self.name = name
        
    def transport(self):
        print("通用运输方法")

class Train(Vehicle):
    def transport(self):  # 方法重写
        print(f"{self.name}高铁正在贴地飞行！")

class Submarine(Vehicle):
    def transport(self):  # 方法重写
        print(f"{self.name}潜艇正在深潜！")

#[钛哥]: 继承+重写是多态的黄金组合！
cr400 = Train("复兴号")
typhoon = Submarine("台风号")

for v in (cr400, typhoon):
    v.transport()

#[钛妹]: 子类各显神通，父类接口统一调用！
#[钛妹]: 听说运算符也是多态？
a = 10 + 20    # 数值相加
b = "Py" + "thon"  # 字符串拼接
print(a, b)  # 输出30 Python

#[钛哥]: +号会根据操作数类型改变行为
#[钛哥]: 数值做数学加，字符串做拼接
#[钛哥]: 甚至支持自定义对象的__add__重载

#[钛妹]: 原来+号才是隐藏的多态大师！
#[钛妹]: 听说Python有"鸭子类型"？
class Dog:
    def sound(self):
        print("汪汪汪！")

class Duck:
    def sound(self):
        print("嘎嘎嘎！")

class Robot:
    def sound(self):
        print("哔哔哔！")

#[钛哥]: 关键看行为，不看继承关系！
def make_sound(obj):
    obj.sound()

make_sound(Dog())   # 汪汪汪！
make_sound(Duck())  # 嘎嘎嘎！
make_sound(Robot()) # 哔哔哔！

#[钛妹]: 只要会叫就是好"鸭子"，太灵活了！

#[钛妹]: 今天学了三板斧：
#[钛妹]: 内置函数根据类型自动适配
#[钛妹]: 类方法同名不同实现
#[钛妹]: 鸭子类型看行为不看血统

#[钛哥]: 记牢这三点，多态就通关啦！
#[钛妹]: 对了各位！持续学习才是硬道理！
#[钛妹]: 点赞关注不迷路！